/*****************************************************************************
 *                                McPAT
 *                      SOFTWARE LICENSE AGREEMENT
 *            Copyright 2012 Hewlett-Packard Development Company, L.P.
 *                          All Rights Reserved
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.”
 *
 ***************************************************************************/

#ifndef ARCH_CONST_H_
#define ARCH_CONST_H_

typedef struct {
  unsigned int capacity;
  unsigned int assoc;  // fully
  unsigned int blocksize;
} array_inputs;

// Do Not change, unless you want to bypass the XML interface and do not care
// about the default values. Global parameters
const int number_of_cores = 8;
const int number_of_L2s = 1;
const int number_of_L3s = 1;
const int number_of_NoCs = 1;

const double archi_F_sz_nm = 90.0;
const unsigned int dev_type = 0;
const double CLOCKRATE = 1.2 * 1e9;
const double AF = 0.5;
// const bool 			inorder			=	true;
const bool embedded = false;  // NEW

const bool homogeneous_cores = true;
const bool temperature = 360;
const int number_cache_levels = 3;
const int L1_property = 0;  // private 0; coherent 1, shared 2.
const int L2_property = 2;
const bool homogeneous_L2s = true;
const bool L3_property = 2;
const bool homogeneous_L3s = true;
const double Max_area_deviation = 50;
const double Max_dynamic_deviation = 50;  // New
const int opt_dynamic_power = 1;
const int opt_lakage_power = 0;
const int opt_area = 0;
const int interconnect_projection_type = 0;

//******************************Core Parameters
#if (inorder)
const int opcode_length = 8;        // Niagara
const int reg_length = 5;           // Niagara
const int instruction_length = 32;  // Niagara
const int data_width = 64;
#else
const int opcode_length = 8;        // 16;//Niagara
const int reg_length = 7;           // Niagara
const int instruction_length = 32;  // Niagara
const int data_width = 64;
#endif

// Caches
// itlb
const int itlbsize = 512;
const int itlbassoc = 0;  // fully
const int itlbblocksize = 8;
// icache
const int icachesize = 32768;
const int icacheassoc = 4;
const int icacheblocksize = 32;
// dtlb
const int dtlbsize = 512;
const int dtlbassoc = 0;  // fully
const int dtlbblocksize = 8;
// dcache
const int dcachesize = 32768;
const int dcacheassoc = 4;
const int dcacheblocksize = 32;
const int dcache_write_buffers = 8;

// cache controllers
// IB,
const int numIBEntries = 64;
const int IBsize = 64;  // 2*4*instruction_length/8*2;
const int IBassoc = 0;  // In Niagara it is still fully associ
const int IBblocksize = 4;

// IFB and MIL should have the same parameters CAM
const int IFBsize = 128;  //
const int IFBassoc = 0;   // In Niagara it is still fully associ
const int IFBblocksize = 4;

const int icache_write_buffers = 8;

// register file RAM
const int regfilesize = 5760;
const int regfileassoc = 1;
const int regfileblocksize = 18;
// regwin  RAM
const int regwinsize = 256;
const int regwinassoc = 1;
const int regwinblocksize = 8;

// store buffer, lsq
const int lsqsize = 512;
const int lsqassoc = 0;
const int lsqblocksize = 8;

// data fill queue RAM
const int dfqsize = 1024;
const int dfqassoc = 1;
const int dfqblocksize = 16;

// outside the cores
// L2 cache bank
const int l2cachesize = 262144;
const int l2cacheassoc = 16;
const int l2cacheblocksize = 64;

// L2 directory
const int l2dirsize = 1024;
const int l2dirassoc = 0;
const int l2dirblocksize = 2;

// crossbar
// PCX
const int PCX_NUMBER_INPUT_PORTS_CROSSBAR = 8;
const int PCX_NUMBER_OUTPUT_PORTS_CROSSBAR = 9;
const int PCX_NUMBER_SIGNALS_PER_PORT_CROSSBAR = 144;
// PCX buffer RAM
const int pcx_buffersize = 1024;
const int pcx_bufferassoc = 1;
const int pcx_bufferblocksize = 32;
const int pcx_numbuffer = 5;
// pcx arbiter
const int pcx_arbsize = 128;
const int pcx_arbassoc = 1;
const int pcx_arbblocksize = 2;
const int pcx_numarb = 5;

// CPX
const int CPX_NUMBER_INPUT_PORTS_CROSSBAR = 5;
const int CPX_NUMBER_OUTPUT_PORTS_CROSSBAR = 8;
const int CPX_NUMBER_SIGNALS_PER_PORT_CROSSBAR = 150;
// CPX buffer RAM
const int cpx_buffersize = 1024;
const int cpx_bufferassoc = 1;
const int cpx_bufferblocksize = 32;
const int cpx_numbuffer = 8;
// cpx arbiter
const int cpx_arbsize = 128;
const int cpx_arbassoc = 1;
const int cpx_arbblocksize = 2;
const int cpx_numarb = 8;

const int numPhysFloatRegs = 256;
const int numPhysIntRegs = 32;
const int numROBEntries = 192;
const int umRobs = 1;

const int BTBEntries = 4096;
const int BTBTagSize = 16;
const int LFSTSize = 1024;
const int LQEntries = 32;
const int RASSize = 16;
const int SQEntries = 32;
const int SSITSize = 1024;
const int activity = 0;
const int backComSize = 5;
const int cachePorts = 200;
const int choiceCtrBits = 2;
const int choicePredictorSize = 8192;

const int commitWidth = 8;
const int decodeWidth = 8;
const int dispatchWidth = 8;
const int fetchWidth = 8;
const int issueWidth = 1;
const int renameWidth = 8;
// what is this forwardComSize=5??

const int globalCtrBits = 2;
const int globalHistoryBits = 13;
const int globalPredictorSize = 8192;

const int localCtrBits = 2;
const int localHistoryBits = 11;
const int localHistoryTableSize = 2048;
const int localPredictorSize = 2048;

const double Woutdrvnandn = 30 * 0.09;    //(24.0 * LSCALE)
const double Woutdrvnandp = 12.5 * 0.09;  //(10.0 * LSCALE)
const double Woutdrvnorn = 7.5 * 0.09;    //(6.0 * LSCALE)
const double Woutdrvnorp = 50 * 0.09;     //	(40.0 * LSCALE)
const double Woutdrivern = 60 * 0.09;     //(48.0 * LSCALE)
const double Woutdriverp = 100 * 0.09;    //(80.0 * LSCALE)

/*
smtCommitPolicy=RoundRobin
smtFetchPolicy=SingleThread
smtIQPolicy=Partitioned
smtIQThreshold=100
smtLSQPolicy=Partitioned
smtLSQThreshold=100
smtNumFetchingThreads=1
smtROBPolicy=Partitioned
smtROBThreshold=100
squashWidth=8
*/

/*
prefetch_access=false
prefetch_cache_check_push=true
prefetch_data_accesses_only=false
prefetch_degree=1
prefetch_latency=10000
prefetch_miss=false
prefetch_past_page=false
prefetch_policy=none
prefetch_serial_squash=false
prefetch_use_cpu_id=true
prefetcher_size=100
prioritizeRequests=false
repl=Null


split=false
split_size=0
subblock_size=0
tgts_per_mshr=20
trace_addr=0
two_queue=false

cpu_side=system.cpu0.dcache_port
mem_side=system.tol2bus.port[2]
*/

//[system.cpu0.dtb]
// type=AlphaDT

#endif /* ARCH_CONST_H_ */
